package com.yingxin.yx.framework.commons.helper;

import com.yingxin.yx.framework.commons.exception.BizException;

import java.math.BigDecimal;
import java.math.RoundingMode;

/**
 * @author fanchao
 */

public class DecimalHelper {

    // a.max (b)  比较取最大值

    // a.min(b)  比较取最小值

    // a.abs() 取最绝对值

    // a.negate() 取相反数

    // SCALE_8

    static int SCALE_8 = 8;

    /**
     * 加
     */
    public static BigDecimal add(BigDecimal a, BigDecimal b) {
        return a.add(b).setScale(SCALE_8, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 加 （ 保留小数位 ）
     */
    public static BigDecimal add(BigDecimal a, BigDecimal b, int scale) {
        return a.add(b).setScale(scale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 减
     */
    public static BigDecimal subtract(BigDecimal a, BigDecimal b) {
        return a.subtract(b).setScale(SCALE_8, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 减 （ 保留小数位 ）
     */
    public static BigDecimal subtract(BigDecimal a, BigDecimal b, int scale) {
        return a.subtract(b).setScale(scale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 乘
     */
    public static BigDecimal multiply(BigDecimal a, BigDecimal b) {
        return a.multiply(b).setScale(SCALE_8, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 乘（ 保留小数位 ）
     */
    public static BigDecimal multiply(BigDecimal a, BigDecimal b, int scale) {
        return a.multiply(b).setScale(scale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 除
     */
    public static BigDecimal divide(BigDecimal a, BigDecimal b) {
        if (b.compareTo(BigDecimal.ZERO) == 0) {
            throw new BizException();
        }
        return a.divide(b, SCALE_8, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 除（ 保留小数位 ）
     */
    public static BigDecimal divide(BigDecimal a, BigDecimal b, int scale) {
        if (b.compareTo(BigDecimal.ZERO) == 0) {
            return BigDecimal.ZERO;
        }
        return a.divide(b, scale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 正负转换
     */
    public static BigDecimal negate(BigDecimal a) {
        return a.negate().setScale(SCALE_8, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 正负转换（ 保留小数位 ）
     */
    public static BigDecimal negate(BigDecimal a, int scale) {
        return a.negate().setScale(scale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 舍弃按照 scale 保留小数位
     */
    public static BigDecimal fixed(BigDecimal a, int scale) {
        return a.setScale(scale, BigDecimal.ROUND_DOWN);
    }

    /**
     * 四舍五入按照 scale 保留小数位
     */
    public static BigDecimal rounding(BigDecimal a, int scale) {
        return a.setScale(scale, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 去除尾部所有零 并返回string
     * @param a
     * @return
     */
    public static String stripTrailingZeros(BigDecimal a) {
        return a.stripTrailingZeros().toPlainString();
    }

    /**
     * 四舍五入，保留两位小数
     * @param decimal
     * @return
     */
    public static BigDecimal roundingKeepTwoDecimalPlaces( BigDecimal decimal ){
        if( decimal != null ){
            return decimal.setScale( 2, BigDecimal.ROUND_HALF_UP );
        }
        return decimal;
    }

    /**
     * 四舍五入，保留三位小数，返回string
     * @param decimal
     * @return
     */
    public static String roundingKeepThreeDecimalPlaces( BigDecimal decimal ){
        if( decimal != null ){
            return decimal.setScale( 3, BigDecimal.ROUND_HALF_UP ).toString();
        }
        return "0.000";
    }

    /**
     * 取整数部分，返回string
     * @param decimal
     * @return
     */
    public static String rounding( BigDecimal decimal ){
        if( decimal != null ){
            return decimal.setScale( 0, RoundingMode.DOWN ).toString();
        }
        return "0";
    }

    /**
     * 验证是否大于 0 ， null时返回false， 0 时返回false 大于0时返回true
     * @param a
     * @return
     */
    public static boolean isGtZero(BigDecimal a) {
        if (a != null && a.compareTo(BigDecimal.ZERO) > 0) {
            return true;
        }
        return false;
    }

    /**
     * 验证是否小于等于0， null 返回true， 0 时返回true， 大于0时返回false
     * @param a
     * @return
     */
    public static boolean isLeZero(BigDecimal a) {
        if (a == null || a.compareTo(BigDecimal.ZERO) <= 0) {
            return true;
        }
        return false;
    }

    /**
     * 如果传入的值是null则返回0， 否则返回当前值
     */
    public static BigDecimal checkNull(BigDecimal a) {
        if( a == null ){
            return BigDecimal.ZERO;
        }
        return a;
    }

}
